package Gestor;

import hibernatenormal.HibernateUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;

public class GestorBase {

    protected Session sesion;
    protected Transaction tx;

    protected void iniciaOperacion() throws HibernateException {
        sesion = HibernateUtil.getSessionFactory().openSession();
        tx = sesion.beginTransaction();
    }

    protected void manejaExcepcion(HibernateException he) {
        tx.rollback();
    }

    public Object insertar(Object nuevoObjeto) {
        Object numNuevo = 0;//retorna nu
        try {
            iniciaOperacion();
            numNuevo = sesion.save(nuevoObjeto);
            tx.commit();

        } catch (HibernateException he) {
            numNuevo = 0;
            System.out.println(he.getCause());
            System.out.println(he.getMessage());
            manejaExcepcion(he);
        } finally {
            sesion.close();
        }

        return numNuevo;
    }

    public boolean InsertarOActualizar(Object nuevoObjeto) {
        boolean verifica = false;
        try {
            iniciaOperacion();
            sesion.saveOrUpdate(nuevoObjeto);
            tx.commit();
            verifica = true;
        } catch (HibernateException he) {
            verifica = false;
            System.out.println(he.getCause());
            System.out.println(he.getMessage());
            manejaExcepcion(he);

        } finally {
            sesion.close();
        }
        return verifica;
    }

    public boolean actualizar(Object nuevoObjeto) {
        boolean verifica = false;
        try {
            iniciaOperacion();
            sesion.update(nuevoObjeto);
            tx.commit();
            verifica = true;
        } catch (HibernateException he) {
            verifica = false;
            System.out.println(he.getCause());
            System.out.println(he.getMessage());
            manejaExcepcion(he);

        } finally {
            sesion.close();
        }
        return verifica;
    }

    public boolean eliminar(Object nuevoObjeto) {
        boolean elimino = false;
        try {
            iniciaOperacion();
            sesion.delete(nuevoObjeto);
            elimino = true;
            tx.commit();
        } catch (HibernateException he) {
            elimino=false;
            System.out.println(he.getCause());
            System.out.println(he.getMessage());
            manejaExcepcion(he);

        } finally {
            sesion.close();
        }
        return elimino;
    }

    protected ResultSet llamarProcedimientoAlmacenado(String nombreProcedimiento, ArrayList<Object> parametros)
            throws SQLException, ClassNotFoundException, IllegalAccessException, InstantiationException {
        GestorConexiones bd = null;
        bd = GestorConexiones.obtenerInstancia();
        Connection cnx = bd.obtenerConexionHibernate();
        String CALL = "CALL " + nombreProcedimiento + "(";
        if (parametros != null) {
            if (!parametros.isEmpty()) {
                for (int i = 0; i < parametros.size() - 1; i++) {

                    CALL += "?,";
                }
                CALL += "?)";
            } else {
                CALL += ")";
            }
        } else {
            CALL += ")";
        }
        PreparedStatement stm = cnx.prepareStatement(CALL);
        stm.clearParameters();
        if (parametros != null) {
            for (int i = 0; i < parametros.size(); i++) {
                stm.setObject(i + 1, parametros.get(i));
            }

        }
        ResultSet rs = stm.executeQuery();

        return rs;
    }

}
